import { ObjectOnlyPushSet } from '../../ObjectOnlyPushSet_operate';
import { toStringTypeCheck } from '../../toStringTypeCheck';
import { prop_static_name_prefix } from '../DataDefine/sourceData';
import { key_ind_arr } from '../Types';

const explore_for_diffTag = 'explore_for_diff';

const prop_static_current_type = `${prop_static_name_prefix}_current_type`;

export const prop_static_child_type_arr = `${prop_static_name_prefix}_child_type_arr`;

const prop_static_default_val = `${prop_static_name_prefix}_default_val`;

class explore_for_diff {
  get [Symbol.toStringTag]() {
    return explore_for_diffTag;
  }

  [key: string]: undefined | any | explore_for_diff;

  /**
   * 深度展开对象
   * 以 子元素 类型 进行 集合管理 forDiff
   * @param target 待展开 对象
   * @param  [deepth] 展开深度 小于 0 或 false 时 不再 深度展开
   */
  constructor(target: any, deepth?: number | boolean) {
    this[prop_static_current_type] = toStringTypeCheck(target);

    deepth == undefined ? (deepth = true) : undefined;

    /**
     * 记录 默认值
     */
    let default_func = () => {
      this[prop_static_default_val] = target;
    };

    /**
     * 遍历 展开
     * 在 元素 是 基础 类型 非 array object 记录默认值
     */
    let loop_func = () => {
      if (typeof target == 'object' || Array.isArray(target)) {
        for (const key in target) {
          let type = toStringTypeCheck(target[key]);
          const staticTypeName = `${prop_static_name_prefix}_${type}`;
          // 添加 到 类型 的 数组集合 并 初始化 当前对象的类型 为 数组
          ObjectOnlyPushSet(
            this,
            staticTypeName,
            [],
            prop_static_child_type_arr
          );

          // 添加 当前 类型集 key 值 并 尝试 深度 展开
          ObjectOnlyPushSet(
            this,
            key,
            new explore_for_diff(target[key], deepth),
            staticTypeName
          );
        }
      } else {
        // 元素 是 基础 类型 非 array object 记录默认值
        default_func();
      }
    };

    /**
     * 逻辑 修订
     * 提前 结束
     */
    if (typeof deepth == 'boolean') {
      if (deepth == true) {
        loop_func();
      } else {
        default_func();
      }
    } else {
      if (deepth >= 0) {
        loop_func();
      } else {
        default_func();
      }
    }

    // 修订 删除 空 占位符
    if (this[prop_static_default_val] == undefined) {
      delete this[prop_static_default_val];
    }
    if (this[prop_static_child_type_arr]?.length == 0) {
      delete this[prop_static_child_type_arr];
    }
  }

  /**
   * 类型 的 数组集合
   */
  [prop_static_child_type_arr]?: key_ind_arr = [];

  /**
   * 当前 层 的 数据 类型
   */
  [prop_static_current_type]: string;

  /**
   * 基础 类型 非 array object
   */
  [prop_static_default_val]?: any;
}

export {
  explore_for_diff,
  explore_for_diffTag,
  prop_static_default_val,
  prop_static_current_type,
};
